#include "mylrchandle.h"
#include<QFile>
#include<QMessageBox>
#include<QDebug>
MyLrcHandle::MyLrcHandle()
{
    lrcdata = NULL;
}

bool MyLrcHandle::lrcInit(QString fileName)
{
    if(fileName.isNull() || fileName.isEmpty()) // 校验
    {
        return false;
    }
    if(lrcdata != NULL) // 如果有歌词对象先进行清空
    {
        delete lrcdata;
    }
    lrcdata = new LrcData;
    QFile songFile(fileName); // 打开文件
    // 判断文件是否存在
    if(!songFile.exists()){
        qDebug() << "未找到到歌词文件";
        return false;
    }
//    if (access(fileName.toUtf8().constData(), F_OK) != 0) {
//        QMessageBox::warning(this, "警告", "未找到到歌词文件");
//        return false;
//    }
    struct stat file_stat; // 文件属性
    int res = stat(fileName.toUtf8().constData(), &file_stat); // 获取文件属性
    if(res != 0)
    {
        perror("stat");
        return false;
    }
    if(!S_ISREG(file_stat.st_mode)) // 判断当前文件是不是普通文件
    {
        qDebug() << "文件类型错误";
        return false;
    }
    if(!songFile.open(QIODevice::ReadOnly))
    {
        qDebug() << "警告", "文件打开失败";
        return false;
    }
    QByteArray data = songFile.readAll(); // 读取歌词文件中的内容
    analyzeLrc(data); // 解析歌词文件
    return true;
}

QString &MyLrcHandle::getTi()
{
    return lrcdata->ti;
}

QString &MyLrcHandle::getAr()
{
    return lrcdata->ar;
}

QString &MyLrcHandle::getAl()
{
    return lrcdata->al;
}

QString &MyLrcHandle::getBy()
{
    return lrcdata->by;
}

std::list<MyLrc> *&MyLrcHandle::getLrc()
{
    return lrcdata->lrc;
}

void MyLrcHandle::analyzeLrc(QString data)
{
    // 切割歌词
    QStringList lrcData = data.split("\n");
    int i=0;
    for(;i<lrcData.size();i++)
    {
        char key[10] = "";
        char value[128] = "";
        sscanf(lrcData.at(i).toStdString().c_str(), "[%[^:]:%[^]]",key, value);
        if (strcmp(key, "ti") == 0) // 歌名
        {
            lrcdata->ti = value;
        }
        else if (strcmp(key, "ar") == 0) // 歌手
        {
            lrcdata->ar = value;
        }
        else if (strcmp(key, "al") == 0) // 专辑
        {
            lrcdata->al = value;
        }
        else if (strcmp(key, "by") == 0) // 制作
        {
            lrcdata->by = value;
        }
        else if (strcmp(key, "offset") == 0) // 延时
        {
            continue;
        }
        else if (isdigit(key[0])) // 识别到数字
        {
            break;
        }
        else
        {
            continue;
        }
    }
    // 歌词信息
    for(;i<lrcData.size();i++)
    {
        QString str = lrcData.at(i);
        if(str.isEmpty() || str.size()< 10) // 处理空行
        {
            continue;
        }
        // [03:34.64][02:34.71][01:05.83]我想就这样牵着你的手不放开(使用splite更方便)
        char *tmp = const_cast<char*>(str.toUtf8().constData());
        char *lrc = tmp;
        while(*lrc == '[') // 如果第一个字符是 [ 跳过固定长度的字符
            lrc += 10;
        while(*tmp == '[') // 获取时间
        {
            int min=0,sec=0;
            sscanf(tmp, "[%d:%d", &min, &sec);
            // 存入qmap中qmap以秒数为key，歌词为value
            lrcdata->lrc->push_back(MyLrc(min * 60 + sec, lrc));
            tmp+=10;
        }
    }
    // 对歌词排序
    lrcdata->lrc->sort(CompareLrc());
}

